/** 
 * Project Name:kaka 
 * File Name:WeChatGetUserInfoAction.java 
 * Package Name:com.luoran.kaka.api.wechat.oauth 
 * Date:2018年12月13日下午8:16:31 
 * Copyright (c) 2018, Luoran, Inc. All Rights Reserved.
 * 
 */  
package com.luoran.kaka.api.wechat.oauth;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.luoran.kaka.api.wechat.model.WechatUserInfo;
import com.luoran.kaka.service.IWechatUserInfoService;
import com.luoran.kaka.utils.ReadUrlUtil;

/** 
 * @author ghl 
 * @since JDK 1.8
 * ClassName: WeChatGetUserInfoAction
 * date: 2018年12月13日 下午8:16:31
 *	小程序授权认证获取用户信息
 */
@RequestMapping("/api/auth")
@Controller
public class WeChatGetUserInfoAction {

	public static final Logger log = LoggerFactory.getLogger(WeChatGetUserInfoAction.class);
	
	@Autowired
	private IWechatUserInfoService wechatUserInfoService;

	@Autowired
	private Environment evi;
	
	
	@RequestMapping("/login")
	@ResponseBody
	public JSONObject getUserInfo(HttpServletRequest request, WechatUserInfo userInfo) throws JSONException, IOException {
		//userInfo 中包含用户信息如下:
		//{country=China, gender=1, province=Shanghai, avatarUrl=https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTIJd240KyOj2dHHFtat13
		//ib5frbkLd9eWmZ4gC84a9IKJic0WLTJRKEGkZOmdr0sibO1iaKtZWASNPAKA/132, city=Baoshan, nickName=Json, language=zh_CN}
		JSONObject obj = new JSONObject(); 
		String code = request.getParameter("code");
		if (!StringUtils.isEmpty(code)) {
			log.info("获取code成功，code为：{}", code);
		} else {
			log.info("网络异常,获取code失败.");
			obj.put("flag", false);
			obj.put("msg", "网络异常,获取code失败");
			return obj;
		}
		String appId = evi.getProperty("wechat.appid");
		String appSecret = evi.getProperty("wechat.appsecret");
		String uri = evi.getProperty("wechat.jscode2session");
		/**
		* 获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程： 
		* GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
		*
		*/
		// 同意授权
		if (code != null) {
			// 拼接请求地址
			String url = uri + "?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code
					+ "&grant_type=authorization_code";
			log.info("获取openId的请求地址为：{}", url);
			JSONObject json = null;
			try {
				json = ReadUrlUtil.readJsonFromUrl(url);// 获取返回值
			} catch (Exception e) {
				e.printStackTrace();
				log.info("网络异常");
				obj.put("flag", false);
				obj.put("msg", "网络异常");
			}
			/**
				*返回的 JSON 数据包
				*属性	类型	说明	最低版本
				*openid	string	用户唯一标识	
				*session_key	string	会话密钥	
				*unionid	string	用户在开放平台的唯一标识符，在满足 UnionID 下发条件的情况下会返回，详见 UnionID 机制说明。	
				*errcode	number	错误码	
				*errmsg	string	错误信息
			 */
			log.info("接口返回数据为：{}", json);
			if(json.containsKey("errcode")) {
				log.info("网络异常,{}",json.getString("errmsg"));
				obj.put("flag", false);
				obj.put("msg", "网络异常"+json.getString("errmsg"));
			}else {
				log.info("用户openid为：{}，session_key为：{}，unionid为：{}。",json.getString("openid"),json.getString("session_key"),json.getString("unionid"));
				/**
				 * 同步微信用户信息
				 */
				if(!StringUtils.isEmpty(json.getString("openid"))) {
					userInfo.setOpenId(json.getString("openid"));
				}
				if(!StringUtils.isEmpty(json.getString("session_key"))) {
					userInfo.setSessionKey(json.getString("session_key"));
				}
				if(!StringUtils.isEmpty(json.getString("unionid"))) {
					userInfo.setUnionId(json.getString("unionid"));
				}
				log.info("同步微信用户信息");
				wechatUserInfoService.SyncWechatUserInfo(userInfo);
				obj.put("flag", true);
				obj.put("userInfo", userInfo);//返回拿到了openid,session_key的用户对象
			}
		}
		return obj;
	}
	
}
